#pragma once
#include <iostream>
#include <hiredis/hiredis.h>

enum class ReplyType : int
{
    kReturnStatus = REDIS_REPLY_STATUS,   // 返回的是一个命令执行后的状态
    kReturnError = REDIS_REPLY_ERROR,     // 返回的是一个命令执行错误提示
    kReturnLongInt = REDIS_REPLY_INTEGER, // 返回的是一个long long整形
    kReturnNil = REDIS_REPLY_NIL,         // 返回的是一个空(nil)
    kReturnString = REDIS_REPLY_STRING,   // 返回的是一个字符串
    kReturnArray = REDIS_REPLY_ARRAY      // 返回的是一个数组
};

class RedisConn
{
public:
    RedisConn() = default;
    ~RedisConn();
    bool connect(const char *, int port = 6379);
    bool executeCommand(const char *);
    char *getRetString();
    ReplyType getReplyType();
    size_t getReplyArraySize();

private:
    redisContext *m_Conn = nullptr;
    redisReply *m_reply = nullptr;
};

inline char *RedisConn::getRetString()
{
    return m_reply->str;
}

inline ReplyType RedisConn::getReplyType()
{
    switch (m_reply->type)
    {
    case REDIS_REPLY_STATUS:
        return ReplyType::kReturnStatus;
        break;
    case REDIS_REPLY_ERROR:
        return ReplyType::kReturnError;
        break;
    case REDIS_REPLY_INTEGER:
        return ReplyType::kReturnLongInt;
        break;
    case REDIS_REPLY_NIL:
        return ReplyType::kReturnNil;
        break;
    case REDIS_REPLY_STRING:
        return ReplyType::kReturnString;
        break;
    case REDIS_REPLY_ARRAY:
        return ReplyType::kReturnArray;
        break;
    default:
        break;
    }
}

inline size_t RedisConn::getReplyArraySize()
{
    return m_reply->elements;
}